package com.netty.example.time.secondsolusion;

import io.netty.buffer.ByteBuf;
import io.netty.channel.ChannelHandlerContext;
import io.netty.handler.codec.ByteToMessageDecoder;

import java.util.List;

/**
 * TimeDecoder 处理碎片问题
 * 1.ByteToMessageDecoder是一个实现ChannelInboundHandler，
 * 可以轻松处理碎片问题。
 */
public class TimeDecoder extends ByteToMessageDecoder {
    /*
    2.ByteToMessageDecoderdecode()每当接收到新数据时，
    都使用内部维护的累积缓冲区调用该方法。
     */
    @Override
    protected void decode(ChannelHandlerContext channelHandlerContext, ByteBuf in, List<Object> out) throws Exception {
        if (in.readableBytes() < 4) {
            /*
            3.decode()out当累积缓冲区中没有足够的数据时，
            可以决定不添加任何内容。收到更多数据时
            ByteToMessageDecoder将decode()再次调用。
             */
            return;
        }
        /*
        4.如果decode()将对象添加到out，则表示解码器成功解码了一条消息。
        ByteToMessageDecoder将丢弃累积缓冲区的读取部分。
        请记住，您不需要解码多条消息。ByteToMessageDecoder会一直调用该
        decode()方法，直到该方法不添加任何内容out。
         */
        out.add(in.readBytes(4));
    }
}
